import request from '@/utils/request'
import { sendChatMessageStream } from '@/api/ai/chat'

/**
 * 发送执法检查咨询消息（流式）
 * @param {Object} params
 * @param {string} params.query - 执法人员输入的问题
 * @param {string} params.user - 执法人员标识
 * @param {string} params.conversation_id - 检查会话ID（可选）
 * @param {Array} params.files - 文件上传列表（存储在 sys.files），用于多模态对话（可选）
 * @param {Object} params.inputs - 工作流输入变量（包括文件变量），存储在自定义变量（可选）
 * @param {AbortSignal} params.signal - 中断信号（可选）
 * @param {string} params.appName - App名称（可选）
 * @param {Function} onMessage - 消息回调
 * @param {Function} onEnd - 结束回调
 * @param {Function} onError - 错误回调
 * @returns {Object} 返回包含 abort 的对象，用于手动中断
 */
export function sendChatMessage({ query, user, conversation_id, files = [], inputs, signal, appName }, onMessage, onEnd, onError) {
  // 构建请求体
  const body = {
    message: query,
    conversationId: conversation_id || '',
    files: files || [],
    appName: appName || ''
  }

  // 添加 inputs（文件变量）
  if (inputs !== undefined && inputs !== null) {
    body.inputs = inputs
    const inputKeys = Object.keys(inputs)
    if (inputKeys.length > 0) {
      console.log('⚖️ 执法检查API - 添加 inputs 到请求体:', inputKeys.join(', '))
    } else {
      console.log('⚖️ 执法检查API - 添加空 inputs 到请求体')
    }
  } else {
    console.log('⚖️ 执法检查API - 不添加 inputs（值为 undefined 或 null）')
  }

  // 只在提供了 files 时才添加（Chatflow 文件上传）
  if (files && files.length > 0) {
    console.log('⚖️ 执法检查API - 添加 files 到请求体:', files.length, '个文件')
  } else {
    console.log('⚖️ 执法检查API - 不添加 files（数组为空或 undefined）')
  }

  // 打印最终的请求体（调试用）
  console.log('⚖️ 发送到执法检查系统的完整请求体:', JSON.stringify(body, null, 2))

  let isAborted = false
  let xhrController = null

  // 使用 sendChatMessageStream 处理 SSE
  xhrController = sendChatMessageStream(
    body,
    (data) => {
      if (isAborted) return
      
      // 处理不同类型的消息
      if (typeof data === 'string') {
        // 普通文本内容
        onMessage && onMessage({
          event: 'message',
          answer: data,
          created_at: Date.now() / 1000
        })
      } else if (data && data.type === 'conversation') {
        // 会话ID
        onMessage && onMessage({
          event: 'conversation',
          conversation_id: data.conversationId
        })
      } else if (data && data.event) {
        // Dify 原生事件格式
        if (data.event === 'message_end') {
          onEnd && onEnd(data)
        } else if (data.event === 'error') {
          onError && onError(data)
        } else {
          onMessage && onMessage(data)
        }
      }
    },
    (error) => {
      if (isAborted) return
      console.error('❌ 执法检查系统错误:', error)
      onError && onError(error)
    },
    () => {
      if (isAborted) return
      onEnd && onEnd({ event: 'message_end' })
    }
  )

  return {
    abort: () => {
      isAborted = true
      if (xhrController && xhrController.abort) {
        xhrController.abort()
      }
    }
  }
}

/**
 * 上传执法检查相关文件
 * @param {File} file - 文件对象
 * @param {string} user - 执法人员标识
 * @param {string} appName - App名称（可选）
 */
export async function uploadFile(file, user, appName) {
  const formData = new FormData()
  formData.append('file', file)
  formData.append('userId', user)
  if (appName) {
    formData.append('appName', appName)
  }

  return request({
    url: '/api/ai/chat/upload',
    method: 'post',
    data: formData,
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
}

/**
 * 获取执法检查会话列表
 * @param {string} user - 执法人员标识
 * @param {number} limit - 返回数量
 * @param {string} appName - App名称（可选）
 */
export async function getConversations(user, limit = 20, appName) {
  const params = { userId: user, limit }
  if (appName) {
    params.appName = appName
  }
  
  const response = await request({
    url: '/api/ai/chat/conversations',
    method: 'get',
    params
  })
  
  // 返回格式与原来保持一致
  if (response && response.data) {
    return { data: response.data }
  }
  return response
}

/**
 * 获取执法检查会话历史消息
 * @param {string} conversation_id - 会话ID
 * @param {string} user - 执法人员标识
 * @param {number} limit - 返回数量
 * @param {string} appName - App名称（可选）
 */
export async function getMessages(conversation_id, user, limit = 20, appName) {
  const params = { userId: user, limit }
  if (appName) {
    params.appName = appName
  }
  
  const response = await request({
    url: `/api/ai/chat/conversations/${conversation_id}/messages`,
    method: 'get',
    params
  })
  
  // 返回格式与原来保持一致
  if (response && response.data) {
    return { data: response.data }
  }
  return response
}

/**
 * 删除执法检查会话
 * @param {string} conversation_id - 会话ID
 * @param {string} user - 执法人员标识
 * @param {string} appName - App名称（可选）
 */
export async function deleteConversation(conversation_id, user, appName) {
  const params = { userId: user }
  if (appName) {
    params.appName = appName
  }
  
  return request({
    url: `/api/ai/chat/dify/conversations/${conversation_id}`,
    method: 'delete',
    params
  })
}

/**
 * 重命名执法检查会话
 * @param {string} conversation_id - 会话ID
 * @param {string} name - 新名称
 * @param {string} user - 执法人员标识
 * @param {boolean} auto_generate - 是否自动生成
 * @param {string} appName - App名称（可选）
 */
export async function renameConversation(conversation_id, name, user, auto_generate = false, appName) {
  const params = { userId: user, name, autoGenerate: auto_generate }
  if (appName) {
    params.appName = appName
  }
  
  return request({
    url: `/api/ai/chat/dify/conversations/${conversation_id}/name`,
    method: 'post',
    params
  })
}

/**
 * 停止响应
 * @param {string} task_id - 任务ID
 * @param {string} user - 执法人员标识
 * @param {string} appName - App名称（可选）
 */
export async function stopChatMessage(task_id, user, appName) {
  const params = { userId: user }
  if (appName) {
    params.appName = appName
  }
  
  return request({
    url: `/api/ai/chat/dify/chat-messages/${task_id}/stop`,
    method: 'post',
    params
  })
}

/**
 * 获取执法检查应用参数
 * @param {string} appName - App名称（可选）
 */
export async function getAppParameters(appName) {
  const params = {}
  if (appName) {
    params.appName = appName
  }
  
  return request({
    url: '/api/ai/chat/dify/parameters',
    method: 'get',
    params,
    timeout: 30000 // 设置30秒超时，因为需要调用外部Dify API
  })
}

/**
 * 获取下一轮建议问题列表
 * @param {string} message_id - 消息ID
 * @param {string} user - 执法人员标识
 * @param {string} appName - App名称（可选）
 */
export async function getSuggestedQuestions(message_id, user, appName) {
  const params = { userId: user }
  if (appName) {
    params.appName = appName
  }
  
  return request({
    url: `/api/ai/chat/dify/messages/${message_id}/suggestions`,
    method: 'get',
    params
  })
}

